<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>后过滤器 | Elasticsearch: 权威指南 | Elastic</title>
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
</head>
<body>
<div class="main-container">
    <section id="content">
        
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原文地址: <a href="https://www.elastic.co/guide/cn/elasticsearch/guide/current/_post_filter.html" rel="nofollow">https://www.elastic.co/guide/cn/elasticsearch/guide/current/_post_filter.html</a>, 版权归 www.elastic.co 所有<br/>
                            英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/guide/current/_post_filter.html" rel="nofollow">https://www.elastic.co/guide/en/elasticsearch/guide/current/_post_filter.html</a>
                            </div>
                        <!-- start body -->
                  <div class="page_header">
<b>请注意:</b><br>本书基于 Elasticsearch 2.x 版本，有些内容可能已经过时。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch: 权威指南</a></span>
»
<span class="breadcrumb-link"><a href="aggregations.html">聚合</a></span>
»
<span class="breadcrumb-link"><a href="_filtering_queries_and_aggregations.html">过滤和聚合</a></span>
»
<span class="breadcrumb-node">后过滤器</span>
</div>
<div class="navheader">
<span class="prev">
<a href="_filter_bucket.html">« 过滤桶</a>
</span>
<span class="next">
<a href="_recap.html">小结 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="_post_filter"></a>后过滤器 (post_filter)<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/300_Aggregations/45_filtering.asciidoc">edit</a>
</h2>
</div></div></div>
<p>目前为止，我们可以同时对搜索结果和聚合结果进行过滤（不计算得分的 <code class="literal">filter</code> 查询），以及针对聚合结果的一部分进行过滤（ <code class="literal">filter</code> 桶）。</p>
<p>我们可能会想，"只过滤搜索结果，不过滤聚合结果呢？" 答案是使用 <code class="literal">post_filter</code> 。</p>
<p>它是一个接收过滤器的最高等级的搜索请求元素。这个过滤器在查询 <em>之后</em> 执行（这正是该过滤器的名字的由来：它在查询之后(<code class="literal">post</code>) 执行）。正因为它在查询之后执行，它对查询范围没有任何影响，所以对聚合也不会有任何影响。</p>
<p>我们可以利用这个行为对查询条件应用更多的过滤器，而不会影响其他的操作，就如 UI 上的各个分类面。让我们为汽车经销商设计另外一个搜索页面，这个页面允许用户搜索汽车同时可以根据颜色来过滤。颜色的选项是通过聚合获得的：</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">GET /cars/transactions/_search
{
    "size" : 0,
    "query": {
        "match": {
            "make": "ford"
        }
    },
    "post_filter": {    <a id="CO198-1"></a><i class="conum" data-value="1"></i>
        "term" : {
            "color" : "green"
        }
    },
    "aggs" : {
        "all_colors": {
            "terms" : { "field" : "color" }
        }
    }
}</pre>
</div>
<div class="sense_widget" data-snippet="snippets/300_Aggregations/45_filtering.json"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO198-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p><code class="literal">post_filter</code> 元素是一个最高等级(<code class="word">top-level</code>)的元素 (与<code class="literal">filter</code>同级别), 而且仅对搜索的命中结果进行过滤。</p>
</td>
</tr>
</table>
</div>
<p><code class="literal">query</code> 部分找到所有的 <code class="word">ford</code> 汽车，然后用 <code class="literal">terms</code> 聚合创建一个颜色列表。因为聚合对查询范围进行操作，颜色列表与福特汽车被喷涂的颜色相对应。</p>

<p>最后， <code class="literal">post_filter</code> 会过滤搜索结果，只展示绿色 <code class="word">ford</code> 汽车。这在查询执行过 <em>后</em> 发生，所以聚合不受影响。</p>

<p>这通常对 UI 的连贯一致性很重要，可以想象用户在界面商选择了一类颜色（比如：绿色），期望的是搜索结果已经被过滤了，而 <em>不是</em> 过滤界面上的选项。如果我们使用 <code class="literal">filter</code> 查询，界面会变成 <em>只</em> 显示 <code class="literal">绿色</code> 作为选项，这不是用户想要的！</p>
<p style="color:#666;">
&gt; 译者注: 这个应该类似于我们的产品列表页面的可用的筛选项目列表. 比如手机的品牌、屏幕大小、内存大小的筛选， 但是貌似这个只能获取一个项目吗？？
</p>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<h3>性能考虑（Performance consideration）</h3>
<p>当你需要对搜索结果和聚合结果做不同的过滤时，你才应该使用 <code class="literal">post_filter</code></p>

<p>有时开发人员会在普通搜索中使用 <code class="literal">post_filter</code> 。 <b>不要这么做！</b> <code class="literal">post_filter</code> 的特性是在查询 <em>之后</em> 执行，任何过滤对性能带来的好处（比如缓存）都会完全失去。</p>

<p><code class="literal">post_filter</code>应该仅被用在 需要<b>不同过滤条件</b> 且 需要<b>聚合</b>时使用。</p>

</div>
</div>
</div>
<div class="navfooter">
<span class="prev">
<a href="_filter_bucket.html">« 过滤桶</a>
</span>
<span class="next">
<a href="_recap.html">小结 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>